﻿#include<iostream>
#include<vector>
using namespace std;

//设两个指针 left ， right 分别指向容器的左右两个端点，此时容器的容积 :
//v = (right - left) * min(height[right], height[left])

//容器的左边界为 height[left] ，右边界为 height[right] 。
//为了⽅便叙述，我们假设「左边边界」⼩于「右边边界」。
//如果此时我们固定⼀个边界，改变另⼀个边界，⽔的容积会有如下变化形式：
//◦ 容器的宽度⼀定变⼩。
//◦ 由于左边界较⼩，决定了⽔的⾼度。
//如果改变左边界，新的⽔⾯⾼度不确定，但是⼀定不会超过右边的柱⼦⾼度，因此容器的容积可能会增⼤。
//
//◦ 如果改变右边界，⽆论右边界移动到哪⾥，新的⽔⾯的⾼度⼀定不会超过左边界，
//也就是不会超过现在的⽔⾯⾼度，但是由于容器的宽度减⼩，因此容器的容积⼀定会变⼩的。
//
//由此可⻅，左边界和其余边界的组合情况都可以舍去。所以我们可以 left++ 跳过这个边界，继续去判断下⼀个左右边界。
//当我们不断重复上述过程，每次都可以舍去⼤量不必要的枚举过程，直到 left 与 right 相遇。
//期间产⽣的所有的容积⾥⾯的最⼤值，就是最终答案。

class Solution {
public:
    int maxArea(vector<int>& height)
    {
        int l = 0, r = height.size() - 1;
        int tmp = 0;
        while (l < r)
        {
            int water = (r - l) * min(height[l], height[r]);
            tmp = max(tmp, water);
            if (height[l] > height[r])
            {
                r--;
            }
            else
            {
                l++;
            }
        }
        return tmp;
    }
};